package com.homelink.android.util;

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.Shader.TileMode;

public class BitmapUtil {
	public static int  FIXED_HEIGHT = 38;
	/**
	 * 
	 * @param txt
	 * @param txtSize
	 * @param fixedHeigth -1, the heigth will be 100
	 * @return
	 */
	public static Bitmap createTxtImage(String txt, int txtSize,int fixedHeigth) {
		Paint p = new Paint();
        p.setAntiAlias(true);
        p.setStrokeWidth(5);
        p.setStrokeCap(Paint.Cap.ROUND);
        p.setTypeface(Typeface.create(Typeface.SERIF,
                                           Typeface.ITALIC));
        p.setTextSize(txtSize);
	//	float[] widths = new float[txt.length()];
		Rect bounds = new Rect();
		
	//	int count = p.getTextWidths(txt,0,txt.length(), widths);
		//float w = p.measureText(txt, 0, txt.length());
		p.getTextBounds(txt, 0, txt.length(), bounds);
		int height = (fixedHeigth==-1)?FIXED_HEIGHT:bounds.height()+4;
		
		Bitmap bp = Bitmap.createBitmap(bounds.width()+4,height, Config.ARGB_8888);
		Canvas canvas = new Canvas(bp);

		p.setColor(Color.rgb(255, 255, 255));
		
		canvas.drawText(txt, 0, FIXED_HEIGHT/2+10, p);
		return bp;
	}

	public static Bitmap createReflectedImage(Bitmap originalImage) {
		// The gap we want between the reflection and the original image

		final int reflectionGap = 0;

		int width = originalImage.getWidth();

		int height = originalImage.getHeight();

		// This will not scale but will flip on the Y axis

		Matrix matrix = new Matrix();

		matrix.preScale(1, -1);

		// Create a Bitmap with the flip matrix applied to it.

		// We only want the bottom half of the image

		Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,

		height / 2, width, height / 2, matrix, false);

		// Create a new bitmap with same width but taller to fit reflection

		Bitmap bitmapWithReflection = Bitmap.createBitmap(width,

		(height + height / 2), Config.ARGB_8888);

		// Create a new Canvas with the bitmap that's big enough for

		// the image plus gap plus reflection

		Canvas canvas = new Canvas(bitmapWithReflection);

		// Draw in the original image

		canvas.drawBitmap(originalImage, 0, 0, null);

		// Draw in the gap

		Paint defaultPaint = new Paint();

		canvas.drawRect(0, height, width, height + reflectionGap, defaultPaint);

		// Draw in the reflection

		canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

		// Create a shader that is a linear gradient that covers the reflection

		Paint paint = new Paint();

		LinearGradient shader = new LinearGradient(0,

		originalImage.getHeight(), 0, bitmapWithReflection.getHeight()

		+ reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);

		// Set the paint to use this shader (linear gradient)

		paint.setShader(shader);

		// Set the Transfer mode to be porter duff and destination in

		paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));

		// Draw a rectangle using the paint with our linear gradient

		canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()

		+ reflectionGap, paint);

		return bitmapWithReflection;

	}
}
